﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfApplication1
{
    public class Ingreso
    {
        public int idIngreso;
        public String descripcionIngreso;
        public Double montoIngreso;

        public readonly int ingresoEsporadico = 0;
        public readonly int ingresoPeriodico = 1;
        public readonly int ingresoInexistente = -1;
        public int tipoIngreso;

        public DateTime fechaInicioIngreso;
        public DateTime fechaFinIngreso;
        public DateTime fechaActualIngreso;

        public static int periodicidadDiaria = 0;
        public static int periodicidadSemanal = 1;
        public static int periodicidadQuincenal = 2;
        public static int periodicidadMensual = 3;
        public static int periodicidadAnual = 4;
        public static int periodicidadEsporádica = -1;

        public int periodicidadIngreso;

        //DateTime fechaBasePagoIngreso;
        public int fechaBasePagoIngreso;

        public Ingreso(){
            descripcionIngreso = "Ingreso" + "";
            tipoIngreso = ingresoEsporadico;
            montoIngreso = 750.00;                           //Ingreso mínimo actual
            fechaInicioIngreso = DateTime.Today;
            fechaFinIngreso = DateTime.Today.AddMonths(1);
            periodicidadIngreso = periodicidadMensual;          
            fechaBasePagoIngreso = 1;                        //primer día del mes
        }

        public Ingreso(String ingresoDescripcion, int tipoIngreso, Double ingresoMonto, DateTime ingresoFechaInicio, DateTime ingresoFechaFin, int ingresoPeriodicidad, int fechaBasePagoIngreso)
        {
            this.descripcionIngreso = ingresoDescripcion;
            this.tipoIngreso = tipoIngreso;
            this.montoIngreso = ingresoMonto;
            this.fechaInicioIngreso = ingresoFechaInicio;
            this.fechaFinIngreso = ingresoFechaFin;
            this.periodicidadIngreso = ingresoPeriodicidad;
            this.fechaBasePagoIngreso = fechaBasePagoIngreso;
        }

        public void setMontoIngreso(Double montoIngreso) 
        { 
            if (montoIngreso > 0)
                {
                    this.montoIngreso = montoIngreso;
                }
                else
                {
                    throw new ArgumentOutOfRangeException("montoIngreso", "El ingreso no puede ser negativo");
                }
        }

        public void validarYAsignarFechaBasePagoIngreso(int fechaBasePagoIngreso, DateTime fechaActualIngreso)
        {
            if (fechaBasePagoIngreso > 0 && fechaBasePagoIngreso <= 31)
            {
                asignarFechaBasePagoIngresoPorMes(fechaBasePagoIngreso, fechaActualIngreso);
            }
            else
            {
                throw new ArgumentOutOfRangeException("fechaBasePagoIngreso", "La fecha base de pago debe corresponder a un número válido en el mes");
            }
        }

        //Para el caso de los meses que tienen menos de 31 días, se toma la fechaBasePagoIngreso como el último día de dicho mes
        public void asignarFechaBasePagoIngresoPorMes(int fechaBasePagoIngreso, DateTime fechaActual)
        {
            int nroDiasMes = DateTime.DaysInMonth(fechaActual.Year, fechaActual.Month);
            
            //Si el usuario seleccionó el último día del mes
            if ((fechaBasePagoIngreso == 31 && nroDiasMes < 31))
            {
                this.fechaBasePagoIngreso = nroDiasMes;
            }
            else if ((fechaBasePagoIngreso == 30 && nroDiasMes < 30))
            {
                this.fechaBasePagoIngreso = nroDiasMes;
            }
            else 
            {   //Si el año no es bisiesto
                if (!DateTime.IsLeapYear(fechaActual.Year))
                {
                    if ((fechaBasePagoIngreso == 29 && nroDiasMes < 29))//caso febrero
                    {
                        this.fechaBasePagoIngreso = nroDiasMes;// el último dia del mes de febrero
                    }
                    else
                    {
                        this.fechaBasePagoIngreso = fechaBasePagoIngreso;
                    }
                }
                else
                {
                    this.fechaBasePagoIngreso = fechaBasePagoIngreso;
                }
            }
        }
    }
}
